/**
 * 战斗系统类型定义
 * 为新的事件驱动战斗引擎提供完整的类型支持
 */

import { Item } from '../../../shared/face';
import rpg_component from '../../../component/rpg_component';

/**
 * 战斗阶段枚举
 */
export enum BattlePhase {
    PREPARING = 'preparing',       // 战斗准备阶段
    INITIALIZING = 'initializing', // 战斗初始化阶段
    ROUND_START = 'round_start',   // 回合开始阶段
    UNIT_ACTION = 'unit_action',   // 单位行动阶段
    ROUND_END = 'round_end',       // 回合结束阶段
    BATTLE_END = 'battle_end',     // 战斗结束阶段
    COMPLETED = 'completed'        // 战斗完成阶段
}

/**
 * 战斗状态枚举
 */
export enum BattleStatus {
    PENDING = 'pending',           // 等待开始
    ACTIVE = 'active',             // 进行中
    PAUSED = 'paused',             // 暂停
    COMPLETED = 'completed',       // 已完成
    CANCELLED = 'cancelled',       // 已取消
    ERROR = 'error'                // 错误状态
}

/**
 * 战斗结果类型
 */
export enum BattleResultType {
    VICTORY = 'victory',           // 胜利
    DEFEAT = 'defeat',             // 失败
    DRAW = 'draw',                 // 平局
    TIMEOUT = 'timeout',           // 超时
    CANCELLED = 'cancelled'        // 取消
}

/**
 * 战斗参与者信息
 */
export interface BattleParticipant {
    /** 参与者ID */
    id: string;
    /** 参与者名称 */
    name: string;
    /** 参与者组件 */
    component: rpg_component;
    /** 是否为主场 */
    isHome: boolean;
    /** 是否存活 */
    isAlive: boolean;
    /** 参与者类型 */
    type: 'player' | 'npc' | 'pet';
    /** 主人ID（对于宠物） */
    masterId?: string;
}

/**
 * 战斗配置
 */
export interface BattleConfig {
    /** 最大回合数 */
    maxRounds: number;
    /** 是否启用技能 */
    enableSkills: boolean;
    /** 是否启用被动技能 */
    enablePassiveSkills: boolean;
    /** 是否启用光环效果 */
    enableAuras: boolean;
    /** 是否启用战斗日志 */
    enableLogging: boolean;
    /** 超时时间（毫秒） */
    timeout: number;
    /** 是否为调试模式 */
    debugMode: boolean;
}

/**
 * 战斗状态
 */
export interface BattleState {
    /** 战斗ID */
    battleId: string;
    /** 当前阶段 */
    phase: BattlePhase;
    /** 战斗状态 */
    status: BattleStatus;
    /** 当前回合数 */
    currentRound: number;
    /** 最大回合数 */
    maxRounds: number;
    /** 主场参与者 */
    homeParticipants: BattleParticipant[];
    /** 客场参与者 */
    awayParticipants: BattleParticipant[];
    /** 战斗开始时间 */
    startTime: number;
    /** 战斗结束时间 */
    endTime?: number;
    /** 当前行动单位 */
    currentActor?: string;
    /** 战斗配置 */
    config: BattleConfig;
}

/**
 * 战斗行动
 */
export interface BattleAction {
    /** 行动ID */
    actionId: string;
    /** 行动者ID */
    actorId: string;
    /** 行动类型 */
    type: 'attack' | 'skill' | 'item' | 'defend' | 'flee';
    /** 目标ID列表 */
    targetIds: string[];
    /** 技能ID（如果是技能行动） */
    skillId?: string;
    /** 物品ID（如果是使用物品） */
    itemId?: string;
    /** 行动参数 */
    params?: Record<string, any>;
    /** 执行时间戳 */
    timestamp: number;
}

/**
 * 战斗效果
 */
export interface BattleEffect {
    /** 效果ID */
    effectId: string;
    /** 效果类型 */
    type: 'damage' | 'heal' | 'buff' | 'debuff' | 'shield' | 'drain';
    /** 来源ID */
    sourceId: string;
    /** 目标ID */
    targetId: string;
    /** 效果值 */
    value: number;
    /** 效果描述 */
    description: string;
    /** 是否为暴击 */
    isCritical?: boolean;
    /** 是否被阻挡 */
    isBlocked?: boolean;
    /** 额外数据 */
    metadata?: Record<string, any>;
}

/**
 * 战斗事件
 */
export interface BattleEvent {
    /** 事件ID */
    eventId: string;
    /** 事件类型 */
    type: string;
    /** 战斗ID */
    battleId: string;
    /** 回合数 */
    round: number;
    /** 相关行动 */
    action?: BattleAction;
    /** 产生的效果 */
    effects: BattleEffect[];
    /** 事件描述 */
    description: string;
    /** 时间戳 */
    timestamp: number;
    /** 额外数据 */
    data?: Record<string, any>;
}

/**
 * 战斗统计
 */
export interface BattleStatistics {
    /** 参与者统计 */
    participantStats: Map<string, ParticipantStats>;
    /** 总回合数 */
    totalRounds: number;
    /** 战斗时长（毫秒） */
    duration: number;
    /** 总伤害 */
    totalDamage: number;
    /** 总治疗 */
    totalHealing: number;
    /** 击杀列表 */
    kills: Array<{
        killerId: string;
        victimId: string;
        round: number;
        timestamp: number;
    }>;
}

/**
 * 参与者统计
 */
export interface ParticipantStats {
    /** 参与者ID */
    participantId: string;
    /** 造成伤害 */
    damageDealt: number;
    /** 承受伤害 */
    damageTaken: number;
    /** 治疗量 */
    healingDone: number;
    /** 被治疗量 */
    healingReceived: number;
    /** 击杀数 */
    kills: number;
    /** 死亡次数 */
    deaths: number;
    /** 使用技能次数 */
    skillsUsed: number;
    /** 行动次数 */
    actionsPerformed: number;
    /** 存活回合数 */
    roundsSurvived: number;
}

/**
 * 战斗结果
 */
export interface BattleResult {
    /** 战斗ID */
    battleId: string;
    /** 结果类型 */
    resultType: BattleResultType;
    /** 获胜方 */
    winner?: 'home' | 'away';
    /** 战斗统计 */
    statistics: BattleStatistics;
    /** 奖励分配 */
    rewards: Map<string, Item[]>;
    /** 经验分配 */
    experience: Map<string, number>;
    /** 战斗报告URL */
    reportUrl?: string;
    /** 完成时间 */
    completedAt: number;
    /** 失败原因（如果失败） */
    failureReason?: string;
}

/**
 * 战斗日志条目
 */
export interface BattleLogEntry {
    /** 日志ID */
    logId: string;
    /** 战斗ID */
    battleId: string;
    /** 回合数 */
    round: number;
    /** 日志类型 */
    type: 'action' | 'effect' | 'phase' | 'system';
    /** 日志消息 */
    message: string;
    /** 相关参与者 */
    participantIds: string[];
    /** 时间戳 */
    timestamp: number;
    /** 详细数据 */
    details?: Record<string, any>;
}

/**
 * 技能使用结果
 */
export interface SkillUseResult {
    /** 是否成功 */
    success: boolean;
    /** 技能ID */
    skillId: string;
    /** 使用者ID */
    casterId: string;
    /** 目标ID列表 */
    targetIds: string[];
    /** 产生的效果 */
    effects: BattleEffect[];
    /** 消耗的资源 */
    resourceCost?: {
        type: 'mp' | 'hp' | 'energy';
        amount: number;
    };
    /** 冷却时间 */
    cooldownTurns?: number;
    /** 失败原因 */
    failureReason?: string;
}

/**
 * 伤害计算结果
 */
export interface DamageCalculationResult {
    /** 基础伤害 */
    baseDamage: number;
    /** 最终伤害 */
    finalDamage: number;
    /** 是否暴击 */
    isCritical: boolean;
    /** 是否被阻挡 */
    isBlocked: boolean;
    /** 伤害类型 */
    damageType: 'physical' | 'magical' | 'true';
    /** 伤害修正因子 */
    modifiers: Array<{
        source: string;
        type: string;
        value: number;
    }>;
}

/**
 * 治疗计算结果
 */
export interface HealingCalculationResult {
    /** 基础治疗 */
    baseHealing: number;
    /** 最终治疗 */
    finalHealing: number;
    /** 实际治疗（考虑最大生命值限制） */
    actualHealing: number;
    /** 是否暴击 */
    isCritical: boolean;
    /** 治疗修正因子 */
    modifiers: Array<{
        source: string;
        type: string;
        value: number;
    }>;
}

/**
 * 战斗规则接口
 */
export interface BattleRules {
    /** 最大回合数 */
    maxRounds: number;
    /** 超时规则 */
    timeoutRules: {
        enabled: boolean;
        maxDuration: number; // 毫秒
        action: 'draw' | 'random_winner';
    };
    /** 逃跑规则 */
    fleeRules: {
        enabled: boolean;
        successRate: number;
        penalty?: string;
    };
    /** 复活规则 */
    reviveRules: {
        enabled: boolean;
        maxRevives: number;
        reviveHealthPercent: number;
    };
}

/**
 * AI行为配置
 */
export interface AIBehavior {
    /** 行为类型 */
    type: 'aggressive' | 'defensive' | 'balanced' | 'random';
    /** 目标选择策略 */
    targetSelection: 'random' | 'lowest_hp' | 'highest_threat' | 'weakest' | 'strongest';
    /** 技能使用概率 */
    skillUseProbability: number;
    /** 防御概率 */
    defenseProbability: number;
    /** 物品使用概率 */
    itemUseProbability: number;
}

/**
 * 战斗上下文
 */
export interface BattleContext {
    /** 当前战斗状态 */
    state: BattleState;
    /** 战斗规则 */
    rules: BattleRules;
    /** 事件历史 */
    eventHistory: BattleEvent[];
    /** 日志 */
    logs: BattleLogEntry[];
    /** 临时数据 */
    temporaryData: Map<string, any>;
}

/**
 * 技能目标信息
 */
export interface SkillTarget {
    /** 目标ID */
    targetId: string;
    /** 目标类型 */
    type: 'ally' | 'enemy' | 'self';
    /** 是否为有效目标 */
    isValid: boolean;
    /** 距离（如果相关） */
    distance?: number;
}

/**
 * 战斗阶段处理器接口
 */
export interface BattlePhaseHandler {
    /** 阶段名称 */
    phase: BattlePhase;
    /** 是否可以处理该阶段 */
    canHandle(context: BattleContext): boolean;
    /** 处理阶段 */
    handle(context: BattleContext): Promise<BattleContext>;
    /** 阶段优先级 */
    priority: number;
}
